package com.cskaoyan.javase.oop1._13block._1building.usecase;

/**
 * 根据构造代码块的特点，分析一下它的实际使用场景。
 *
 *      1.构造代码块最大的特点就是其中的代码，最终会加入类的所有构造器中，所以依据这一点：
 *      我们可以"提取公因式"一样的，把所有构造器都需要执行的代码，放入构造代码块中。
 *
 *      2.其次，构造代码块毕竟是给成员变量赋值用的，所以：
 *          如果需要很复杂的代码完成成员变量的赋值（如果只是给一个值，用显式赋值和构造器足矣）
 *          (这种情况不多见,了解就行了)
 *      比如需要一个算法，需要一定计算等等。在这些场景下，使用构造代码块赋值也是一个不错的选择。
 *
 *      补充:
 *      构造代码块能不能给静态成员变量赋值?
 *          当然可以,因为构造代码块的执行是在new对象过程中,既然已经创建对象了
 *          类加载已经进行了,所以静态成员变量肯定已经存在了,可以对它进行赋值
 *      但这种赋值,依赖于创建对象,如果不创建对象,这个赋值是不生效的.
 *
 * 实际上,我们完全有需求,在类加载过程中,利用代码块给静态成员变量赋值,这时就不会依赖于创建对象了
 * 有没有这种代码块呢?
 * 当然有,那就是静态代码块
 *
 * @since 17:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*for (int i = 0; i < 3; i++) {
            new Student();
        }
        for (int i = 0; i < 5; i++) {
            new Student("法外狂徒-张三");
        }
        for (int i = 0; i < 2; i++) {
            new Student(10, "张三");
        }*/
        System.out.println(Student.count);
    }
}

class Student {
    static int count = 0;

    int age;
    String name;

    {
        count++;
    }

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
}